Rustの高階関数の関数ポインタの戻り値型にimpl Traitは使えない
以下はコンパイルエラーがだが、
これできるようになってほしい。
code:rs
// 注意: f3()の戻り値型のimpl Future<Output=i32>でコンパイルエラー
pub fn f3() -> fn(i32) -> impl Future<Output=i32> {
|_: i32| {
futures::future::lazy(|_| 10)
}
}
上記のコンパイルを通すには、明示的にLazyの型を戻り値に書くと通る。
ただ、この型を見つけ出すのはそこそこ労力がかかる。
code:rust
// コンパイル通る
pub fn f3() -> fn(i32) -> futures::future::Lazy<fn(&mut std::task::Context) -> i32> {
|_: i32| {
futures::future::lazy( |_| 10)
}
}
例えば、以下のように環境をもつクロージャなどを作りたくなるとだいぶ型が複雑になる。
code:rust
// コンパイル通る
pub fn f3(s: String) -> impl FnOnce(i32) -> futures::future::Lazy<Box<dyn FnOnce(&mut std::task::Context) -> i32>> {
move |b: i32| {
let i = s.len() as i32;
futures::future::lazy(Box::new(move |_: &mut std::task::Context| i + b + 10))
}
}
関数型言語でよくやることを実現するのに労力がかかりそう。 だが impl Iterator<Item=impl Future<Output=i32>>を戻り値にできる
つまり以下はコンパイルが通る。
code:rs
fn f4(xs: Vec<i32>) -> impl Iterator<Item=impl Future<Output=i32>> {
xs.into_iter().map(|x|
futures::future::lazy(move |_| x)
)
}
hr.icon
関連: